package com.nanbei.future;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * @ClassDescription: CompletableFuture API 的使用
 * @JdkVersion: 1.8
 * @Author: libs
 * @Created: 2024/9/26 11:06
 */
public class CompletableFutureAPIDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
        CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.MILLISECONDS.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "completableFuture api ... ";
        });


        try {
            TimeUnit.MILLISECONDS.sleep(2100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // get() 会阻塞当前线程，直到异步线程运行结束返回结果 ，且get方法会抛出异常
        //System.out.println(stringCompletableFuture.get());

        // get() 设置等待时间，如果等待时间结束了，但是异步线程还没有返回数据会抛出异常
        //System.out.println(stringCompletableFuture.get(1000, TimeUnit.MILLISECONDS));
        //System.out.println(stringCompletableFuture.get(2100, TimeUnit.MILLISECONDS));

        // join() 获取异步线程的结果，和 get() 方法不同的是 在编译阶段不会抛出异常
        // System.out.println(stringCompletableFuture.join());

        // 立即获取结果，如果异步线程没有结束则输出默认值
        // System.out.println(stringCompletableFuture.getNow("异步线程没有结算，输出默认值"));

        // 异步线程如果在 complete() 方法前还没有执行完，则在此处异步线程的状态会设置为 已完成，并将参数值赋值为异步线程的返回值
        System.out.println("异步线程是否被打断："+stringCompletableFuture.complete("异步线程被打断后设置的默认值"));
        System.out.println(stringCompletableFuture.join());

    }
}
